package models

import (
	"context"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo/options"
)

// MessageBasic 消息基础结构
type MessageBasic struct {
	UserIdentity string `json:"user_identity" bson:"user_identity"` // 用户ID
	RoomIdentity string `json:"room_identity" bson:"room_identity"` // 房间ID
	Data         string `json:"data" bson:"data"`                   // 消息内容
	CreatedAt    int64  `json:"created_at" bson:"created_at"`       // 创建时间
	UpdatedAt    int64  `json:"updated_at" bson:"updated_at"`       // 更新时间
}

// CollectionName 返回MongoDB集合名
func (MessageBasic) CollectionName() string {
	return "message_basic"
}

// InsertOneMessageBasic 向数据库插入单条消息记录
func InsertOneMessageBasic(mb *MessageBasic) error {
	// 执行MongoDB插入操作
	_, err := Mongo.Collection(MessageBasic{}.CollectionName()).InsertOne(context.Background(), mb)
	return err // 返回插入结果（成功返回nil，失败返回错误信息）
}

// GetMessageListByRoomIdentity 根据房间标识获取消息列表
func GetMessageListByRoomIdentity(roomIdentity string, limit *int64, skip *int64) ([]*MessageBasic, error) {
	// 定义消息结构体切片，用于存储查询结果
	var messageList []*MessageBasic

	// 设置MongoDB查询条件：按房间标识筛选，且消息类型为普通消息(0)
	cursor, err := Mongo.Collection(MessageBasic{}.CollectionName()).Find(context.Background(), bson.M{
		"room_identity": roomIdentity, // 房间标识
	}, &options.FindOptions{
		Limit: limit, // 限制返回记录数量（分页大小）
		Skip:  skip,  // 跳过记录数量（用于分页）
		Sort: bson.M{
			"created_at": -1, // 按创建时间降序排列（最新消息在前）
		},
	})

	// 查询出错处理
	if err != nil {
		return nil, err // 返回空结果和错误信息
	}

	// 遍历查询结果，解码每条消息
	for cursor.Next(context.Background()) {
		msg := &MessageBasic{}    // 创建消息对象
		err := cursor.Decode(msg) // 将MongoDB文档解码为消息结构体
		if err != nil {
			return nil, err // 解码出错时返回错误
		}
		messageList = append(messageList, msg) // 将消息添加到结果列表
	}

	// 返回消息列表和空错误（表示成功）
	return messageList, nil
}
